home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / bled16.arc / BLED.BAS next >
BASIC Source File  |  1987-03-21  |  28KB  |  969 lines

  1. REM ****************************************************************
  2. REM *         NOTICE:  DO NOT REMOVE THIS NOTICE                   *
  3. REM *         BLED - (C) 1985-1987 by Ken Goosens                  *
  4. REM *       5020 Portsmouth Road, Fairfax, VA 22032                *
  5. REM ****************************************************************
  6. REM 8 April 1986 enhanced to add comments to bled merge
  7. REM 13 April 1986 fixed bug so could embed source code in comments
  8. REM 1 June 1986 Added buffered output & increased default max lines
  9. REM 25 Jan 1987 Support for preserving BLED and BLED SOURCE comments
  10. REM 8 Mar 1987 Fixed 2 bugs concerning preserve option
  11. REM 21 Mar 1987 Added beeps at end of a batch run
  12. REM *******************   DRIVER MODULE   **************************
  13.  
  14. DEFINT A-Z
  15.  
  16. NCNFG = 13
  17. DIM CWRDS$(10),FROW(3),FCOL(3),FPROMPT$(3),FFLDSIZE(3),FFLDTYPE$(3),_
  18.     FFLDVAL$(3),FHLP$(3),CROW(NCNFG),CCOL(NCNFG),CPRO$(NCNFG),_
  19.     CFLDSIZE(NCNFG),CFLDTYPE$(NCNFG),CFLDVAL$(NCNFG),CHLP$(NCNFG)
  20.  
  21. GOSUB DOCMDLINE
  22. GOSUB SETCONSTANTS
  23. GOSUB GETCONFIG
  24. LBLK = LEN(ENDBLK$)
  25. TRANSBLK$ = SPACE$(LBLK)
  26. OPEN "O",#4,WARNFILE$
  27. MAXBTWLINES = VAL(MAXBTWLINES$)
  28. REDIM MBUF$(MAXBTWLINES),TBUF$(MAXBTWLINES)
  29. IF RUN.BATCH=0 THEN GOSUB ASKMERGE
  30.  
  31. WHILE ANS$ <> "Q"
  32.    X = INSTR(CMVAL$,ANS$)
  33.    IF X>1 THEN PRINT #4,"--[WARNINGS FOR FUNCTION ";ANS$;"]--
  34.    FILE.COMPARE = (ANS$ = "F")
  35.    ON INSTR (CMVAL$,ANS$) GOSUB SETCONFIG,FILECOMPARE,DOLINEMERGE,DOMERGE
  36.    NWRITE = -1
  37.    CALL WRITENEW (X$,NWRITE)
  38.    CLOSE #3
  39.    COLOR 7,0
  40.    ANS$ = "Q"
  41.    IF RUN.BATCH=0 THEN GOSUB ASKMERGE ELSE BEEP:BEEP:BEEP
  42. WEND
  43. CLOSE #4
  44. LOCATE 24,1:PRINT
  45.       
  46. END
  47.  
  48. REM  *********************    GOSUBS    **************************
  49.  
  50. ASKMERGE:
  51.  
  52.    LOCATE CMRO,1
  53.    PRINT SPACE$(79)
  54.    CALL GETCHAR (CMRO,CMCO,CMPRO$,CMVAL$,ANS$)
  55.  
  56. RETURN
  57.  
  58. REM  ****              PREPATORY SUBROUTINES                  ****
  59. REM  **********  DOCMDLINE, SETCONSTANTS, GETCONFIG **************
  60.  
  61. REM -----------------------[ DOCMDLINE ]------------------------------------------------
  62.  
  63. DOCMDLINE:
  64.  
  65. REM PROCESSES COMMAND LINE ARGUMENTS FROM DOS
  66.  
  67.   RUN.BATCH  = INSTR(COMMAND$,"/B")
  68.   LINE.MERGE = INSTR(COMMAND$,"/L")
  69.   REG.MERGE  = INSTR(COMMAND$,"/M")
  70.   FILE.COMPARE = INSTR(COMMAND$,"/F")
  71.  
  72.   IF (LINE.MERGE OR REG.MERGE OR FILE.COMPARE)  THEN_
  73.   IF (LINE.MERGE AND REG.MERGE) OR (LINE.MERGE AND FILE.COMPARE) OR_
  74.      (REG.MERGE AND FILE.COMPARE) THEN_
  75.        X$="Can not use more than one of /F /L /M.":GOSUB DOABORT
  76.   IF REG.MERGE THEN ANS$="M" ELSE_
  77.      IF LINE.MERGE THEN ANS$="L" ELSE_
  78.      IF FILE.COMPARE THEN ANS$="F" ELSE ANS$=""
  79.   IF RUN.BATCH AND ANS$="" THEN_
  80.      X$="Must specify one of /F /L /M to run batch.":GOSUB DOABORT
  81.   CALL BRKWORDS (COMMAND$,CWRDS$())
  82.   NON.OPT = 1
  83.   WHILE INSTR(CWRDS$(NON.OPT),"/") > 0
  84.     NON.OPT = NON.OPT + 1
  85.   WEND
  86.   IF RUN.BATCH AND CWRDS$(NON.OPT+2)="" THEN_
  87.     X$="Must specify all three file arguments to run batch.":GOSUB DOABORT
  88.   IF COMMAND$="" THEN CALL CREDITS
  89.  
  90.   IF CWRDS$(NON.OPT+4)<>"" THEN_
  91.      CONFIGFILE$ = CWRDS$(NON.OPT+4)_
  92.   ELSE_
  93.      CONFIGFILE$ = "BLED.CFG"
  94.   IF CWRDS$(NON.OPT+3)<>"" THEN_
  95.      WARNFILE$ = CWRDS$(NON.OPT+3)_
  96.   ELSE_
  97.      WARNFILE$ = ""
  98.   IF CWRDS$(NON.OPT+2)<>"" THEN_
  99.      NEWFILE$=CWRDS$(NON.OPT+2) _
  100.   ELSE_
  101.      NEWFILE$="SC"
  102.   IF CWRDS$(NON.OPT+1)<>"" THEN_
  103.      BTCHCMDS$=CWRDS$(NON.OPT+1) _
  104.   ELSE_
  105.      BTCHCMDS$="SC"
  106.   IF CWRDS$(NON.OPT)<>"" THEN_
  107.      ORIGFILE$=CWRDS$(NON.OPT) _
  108.   ELSE_
  109.      ORIGFILE$="SC"
  110.  
  111.   LIMIT.RUN = INSTR(COMMAND$,"/T=")
  112.   IF LIMIT.RUN=0 THEN RETURN
  113.   LIMIT.RUN = LIMIT.RUN + 1
  114.   LAST.CHAR = INSTR(LIMIT.RUN,COMMAND$,"/")
  115.   IF LAST.CHAR=0 THEN LAST.CHAR = INSTR(LIMIT.RUN,COMMAND$," ")
  116.   IF LAST.CHAR=0 THEN LAST.CHAR = LEN(COMMAND$)+1
  117.   MAX.LL = VAL(MID$(COMMAND$,LIMIT.RUN+2,LAST.CHAR-LIMIT.RUN-2))
  118. REM  PRINT "MAX.LL=";MAX.LL;" GOT FROM ";COMMAND$;" starting at ";LIMIT.RUN+2;_
  119. REM    " and grabbing ";LAST.CHAR-LIMIT.RUN-2;" chars"
  120. REM   PRINT "Last char=";last.char: input xx$
  121. RETURN
  122.  
  123. DOABORT:
  124.  
  125. REM PREMATURELY TERMINATE WITH CENTERED ERROR MESSAGE AND HELP
  126.  
  127.   BEEP
  128.   X = LEN(X$)+17
  129.   IF X<78 THEN K = (78-X)/2 ELSE K=0
  130.   PRINT SPACE$(K);X$;"  Aborting."
  131.   CALL PRTHELP
  132.   END
  133.  
  134. RETURN
  135.  
  136. REM --------------------------[ SETCONSTANTS ]-----------------------------
  137.  
  138. SETCONSTANTS:
  139.  
  140. REM ASSIGNS CONSTANTS USED IN PROGRAM
  141.  
  142.   HI.VALUE# = 99999999
  143.   ONE = 1
  144.   TWO = 2
  145.   SEVENTYTWO = 72
  146.  
  147.   INSERTING$ = "* INSERTING new line(s)"
  148.   DELETING$ = "* DELETING old line(s)"
  149.   REPLACING$ = "* REPLACING old line(s) by new"
  150.   FIRSTDIF$ = "* ------[ first line different ]------"
  151.  
  152.   CMPRO$ = "C)onfigure, F)ile compare, L)ine# merge, M)erge, Q)uit (C,F,L,M,Q): "
  153.   CMRO = 21
  154.   CMCO = 4
  155.   CMVAL$ = "CFLMQ"
  156.  
  157.   EDPRO$ = "E)dit, R)un, Q)uit (E,R,Q): "
  158.   EDRO = 23
  159.   EDCO = 18
  160.   EDVAL$= "ERQ"
  161.  
  162.   CFRO = 23
  163.   CFCO = 20
  164.   CFPRO$ = "E)dit, S)ave, Q)uit (E,S,Q): "
  165.   CFVAL$ = "ESQ"
  166.  
  167.   THREE = 3
  168.   FOUR = 4
  169.   FROW(1) = 7
  170.   FROW(2) = 9
  171.   FROW(3) = 11
  172.   FCOL(1) = 10
  173.   FCOL(2) = 10
  174.   FCOL(3) = 10
  175.   FFLDSIZE(1) = 40
  176.   FFLDSIZE(2) = 40
  177.   FFLDSIZE(3) = 40
  178.   FFLDTYPE$(1) = "S"
  179.   FFLDTYPE$(2) = "S"
  180.   FFLDTYPE$(3) = "S"
  181.   IN.MERGE = -1
  182.  
  183.   FOR I = 1 TO NCNFG
  184.     READ CROW(I),CCOL(I),CPRO$(I),CFLDSIZE(I),CFLDTYPE$(I),CFLDVAL$(I),CHLP$(I)
  185.   NEXT
  186.  
  187. DATA  01,18,"BATCH LINE EDITOR - CONFIGURATION   Ver 1.5",00,L,   ,
  188. DATA  03,12,"Source EXTENSION:"                  ,03,S,BAS,"Default extension for source file to be edited (e.g. BAS)"
  189. DATA  04,12,"Merge EXTENSION:"                   ,03,S,MRG,"Default extension for file of changes to source (e.g. MRG)"
  190. DATA  05,12,"Source remarks begin with:"         ,03,S,"'","Logically ignore rest of physical line beyond this"
  191. DATA  06,12,"END OF BLOCK Phrase:"               ,20,S,ENDBLOCK,"Phrase used in BLED for the end of a block"
  192. DATA  07,12,"Documentation BEGINS with: "        ,01,S,*  ,"Character that documentation lines begin with in BLED merge file"
  193. DATA  08,12,"Alphanumeric LABELS END with:"      ,01,S,":","Character on end of an alphanumeric label (e.g. ':' in 'GETOUT:')"
  194. DATA  09,12,"BLED COMMANDS BEGIN with:"          ,01,S,   ,"Character starting BLED commands in merge file (default none)"
  195. DATA  10,12,"IGNORE CASE in Labels?"             ,01,S,Y  ,"Lower/upper case are same in labels (e.g. 'LABEL1' and 'label1')"
  196. DATA  11,12,"CONTINUED LINES END with:"          ,01,S,_  ,"Character used to continue logical line onto next line"
  197. DATA  12,12,"Write WARNINGS to:"                 ,30,S,WARNING,"File to write warning messages to"
  198. DATA  13,12,"Max # physical lines btw line #'s:" ,04,N,400,"In file compare, max # physical lines between two line numbers"
  199. DATA  14,12,"Preserve BLED comments (Y/N):"      ,01,S,Y  ,"Convert BLED comments to/from source BLED comments"
  200. RETURN
  201.  
  202. REM -------------------------[ GETCONFIG ]---------------------------------
  203.  
  204. GETCONFIG:
  205.  
  206. REM   GETS CONFIGURATION PARAMETERS
  207.  
  208.    ON ERROR GOTO NOCONFIG
  209.    OPEN "I",#1,CONFIGFILE$
  210.  
  211.    READIN:
  212.      ON ERROR GOTO 0
  213.      LINE INPUT #1,DESOURCE$
  214.      LINE INPUT #1,DEMERGES$
  215.      LINE INPUT #1,REMCHAR$
  216.      LINE INPUT #1,ENDBLK$
  217.      LINE INPUT #1,DOCCHAR$
  218.      LINE INPUT #1,END.LABEL$
  219.      LINE INPUT #1,BLEDCMD$
  220.      LINE INPUT #1,IGNORECASE$
  221.      LINE INPUT #1,LINEON$
  222.      LINE INPUT #1,X$
  223.      IF WARNFILE$ = "" THEN WARNFILE$ = X$
  224.      LINE INPUT #1,MAXBTWLINES$
  225.      LINE INPUT #1,X$
  226.      PRESERVE.COMMENTS = (LEFT$(X$,1)<>"N")
  227.      BLED.SOURCE.COMMENT$ = REMCHAR$ + "<" + DOCCHAR$ + ">"
  228.      CLOSE #1
  229.    RETURN
  230.  
  231.    USEDEFAULTS:
  232.      ON ERROR GOTO 0
  233.      DESOURCE$ = "BAS"
  234.      DEMERGES$ = "MRG"
  235.      REMCHAR$  = "'"
  236.      ENDBLK$     = "ENDBLOCK"
  237.      DOCCHAR$    = "*"
  238.      END.LABEL$  = ":"
  239.      BLEDCMD$    = ""
  240.      IGNORECASE$ = "Y"
  241.      LINEON$     = "_"
  242.      IF WARNFILE$ = "" THEN WARNFILE$ = "WARNING"
  243.      MAXBTWLINES$ = "400"
  244.      PRESERVE.COMMENTS = 0
  245.    RETURN
  246.  
  247. NOCONFIG:
  248.    X$ = "Config file "+CONFIGFILE$+" missing/bad.  Using QuickBASIC defaults."
  249.    CALL EXPLAIN(X$)
  250.    RESUME USEDEFAULTS
  251.  
  252. REM -----------------------------------------------------------------------
  253.  
  254. REM *****                MAIN   ROUTINES                       ****
  255. REM **********  SETCONFIG,FILECOMPARE,DOLINEMERGE,DOMERGE      ****
  256.  
  257. REM -----------------------[ SETCONFIG ]-----------------------------------
  258.  
  259. SETCONFIG:
  260.  
  261. REM      ALLOWS USER TO RECONFIGURE
  262.  
  263.    CFLDVAL$(2) = DESOURCE$
  264.    CFLDVAL$(3) = DEMERGES$
  265.    CFLDVAL$(4) = REMCHAR$
  266.    CFLDVAL$(5) = ENDBLK$
  267.    CFLDVAL$(6) = DOCCHAR$
  268.    CFLDVAL$(7) = END.LABEL$
  269.    CFLDVAL$(8) = BLEDCMD$
  270.    CFLDVAL$(9) = IGNORECASE$
  271.    CFLDVAL$(10)= LINEON$
  272.    CFLDVAL$(11)= WARNFILE$
  273.    OLDWARN$    = WARNFILE$
  274.    CFLDVAL$(12)= MAXBTWLINES$
  275.    CFLDVAL$(13)= MID$("NY",1-PRESERVE.COMMENTS,1)
  276.  
  277.    CALL PRTSCRN (NCNFG,CROW(),CCOL(),CPRO$(),CFLDSIZE(),CFLDTYPE$(),_
  278.                  CFLDVAL$(),CHLP$())
  279.    CO=1:CALL QPRINT (SPACE$(79),FRO,CO)
  280.    RESETCNFG:
  281.      ANS$="E"
  282.      CALL GETCHAR(CFRO,CFCO,CFPRO$,CFVAL$,ANS$)
  283.      WHILE ANS$ = "E"
  284.        CALL GETSCRN (NCNFG,CROW(),CCOL(),CPRO$(),CFLDSIZE(),CFLDTYPE$(),_
  285.                  CFLDVAL$(),CHLP$())
  286.        LOCATE CFRO,1:PRINT SPACE$(79)
  287.        ANS$="":CALL GETCHAR (CFRO,CFCO,CFPRO$,CFVAL$,ANS$)
  288.      WEND
  289.  
  290.  DESOURCE$ = CFLDVAL$(2)
  291.  BTCHCMDS$ = CFLDVAL$(3)
  292.  REMCHAR$  = CFLDVAL$(4)
  293.  ENDBLK$   = CFLDVAL$(5)
  294.  DOCCHAR$  = CFLDVAL$(6)
  295.  END.LABEL$ = CFLDVAL$(7)
  296.  BLEDCMD$   = CFLDVAL$(8)
  297.  IGNORECASE$ = CFLDVAL$(9)
  298.  LINEON$     = CFLDVAL$(10)
  299.  WARNFILE$   = CFLDVAL$(11)
  300.  MAXBTWLINES$= CFLDVAL$(12)
  301.  PRESERVE.COMMENTS = (LEFT$(CFLDVAL$(13),1)<>"N")
  302.  BLED.SOURCE.COMMENT$ = REMCHAR$ + "<" + DOCCHAR$ + ">"
  303.  IF WARNFILE$ <> OLDWARN$ THEN_
  304.    CLOSE #4:OPEN "O",#4,WARNFILE$
  305.  IF ANS$ = "Q" THEN RETURN  
  306.  IF ANS$ <> "S" THEN RETURN
  307.      OPEN "O",#1,CONFIGFILE$
  308.      FOR I = 1 TO NCNFG
  309.        IF CFLDTYPE$(I) <> "L" THEN PRINT #1,CFLDVAL$(I)
  310.      NEXT
  311.      CLOSE #1
  312.      GOTO RESETCNFG
  313.  
  314. RETURN
  315.  
  316. REM -----------------------[ FILECOMPARE ]---------------------------------
  317.  
  318. FILECOMPARE:
  319.  
  320. REM     COMPARES TWO FILES, PRODUCES MERGE FILE FOR LINE MERGING
  321.  
  322.   IN.MERGE = 0
  323.   FPROMPT$(1)= "OLD Version:"
  324.   FPROMPT$(2)= "NEW Version:"
  325.   FPROMPT$(3)= "MERGES (to OLD to make NEW):"
  326.   FHLP$(1)   = "Old version of file that has been changed"
  327.   FHLP$(2)   = "New, modified version of file"
  328.   FHLP$(3)   = "Create file of changes to old version needed to make new version"
  329.   TOPTITLE$ = "COMPARING FILES - Generating Merge"
  330.   GOSUB GETFILES
  331.   IF FANS$ = "Q" THEN RETURN
  332.  
  333.    HEADER$ = DOCCHAR$ + " ------------[ BLED merge (c) Ken Goosens ]-------------"
  334.    CALL WRITENEW (HEADER$,NWRITE)
  335.    HEADER$ = DOCCHAR$ + " Merge this against " + ORIGFILE$ + _
  336.              " to produce " + BTCHCMDS$
  337.    CALL WRITENEW (HEADER$,NWRITE)
  338.    CALL GETFDATE (ORIGFILE$+CHR$(0),MM,DD,YY)
  339.    FDATE$ = MID$(STR$(MM),2)+"-"+MID$(STR$(DD),2)+"-"+MID$(STR$(YY),2)
  340.    FSIZE$ = MID$(STR$(LOF(2)),2)+" bytes"
  341.    HEADER$ = DOCCHAR$ + " " + ORIGFILE$ + ":  Date " + FDATE$ + "  Size " + FSIZE$
  342.    CALL WRITENEW (HEADER$,NWRITE)
  343.    HEADER$ = DOCCHAR$ + " ------------[ Created "+DATE$+" "+TIME$+" ]------------"
  344.    CALL WRITENEW (HEADER$,NWRITE)
  345.  
  346.    TRANS# = 0
  347.    MAST#  = 0
  348.    GOSUB READLINETRANS
  349.    GOSUB READLINEOLD
  350.    WHILE MAST# < HI.VALUE# OR TRANS# < HI.VALUE#
  351.       IF TRANS# < MAST# THEN _
  352.          CALL WRITENEW (INSERTING$,NWRITE) : _
  353.          WHILE TRANS# < MAST#: _
  354.            GOSUB COMPARENUTRANS:_
  355.            CALL WRITENEW (NUTRANS$,NWRITE):_
  356.            GOSUB READLINETRANS:_
  357.          WEND
  358.       IF MAST# < TRANS# THEN _
  359.          CALL WRITENEW (DELETING$,NWRITE) : _
  360.          WHILE MAST# < TRANS# : _
  361.            PREV# = MAST# : _
  362.            FW$ = MID$(STR$(MAST#),2) : _
  363.            CALL WRITENEW (FW$,NWRITE) : _
  364.            WHILE PREV# = MAST# : _
  365.              GOSUB READLINEOLD : _
  366.            WEND: _
  367.          WEND
  368.       IF TRANS# = MAST# AND MAST# < HI.VALUE# THEN_
  369.          PREV# = TRANS#:J=0:_
  370.          WHILE PREV# = TRANS# AND J < MAXBTWLINES:_
  371.            J=J+1:TBUF$(J)=NUTRANS$:_
  372.            GOSUB READLINETRANS:_
  373.          WEND:_
  374.          I=0:_
  375.          WHILE PREV# = MAST# AND I<MAXBTWLINES:_
  376.            I=I+1:MBUF$(I)=TRANS$:_
  377.            GOSUB READLINEOLD:_
  378.          WEND:_
  379.          GOSUB CHKEXCEED:_
  380.          IF M$<>"" THEN_
  381.            N$="Logical line exceeds maximum physical lines.  Reconfigure":_
  382.            CALL WRMIS (M$,N$)_
  383.          ELSE_
  384.            GOSUB CHKDIF:_
  385.            IF ARE.DIFF THEN_
  386.              CALL WRITENEW (REPLACING$,NWRITE) : _
  387.              GOSUB COMPARETBUF: _
  388.              FOR I=1 TO K-1:CALL WRITENEW (TBUF$(I),NWRITE):NEXT :_
  389.              GOSUB WRITEDIF : _
  390.              FOR I=K TO MAX:CALL WRITENEW (TBUF$(I),NWRITE):NEXT :_
  391.              FOR I=MAX+1 TO MAXMAX:CALL WRITENEW (TBUF$(I),NWRITE):NEXT
  392.    WEND
  393.    CLOSE #1,#2
  394.    IN.MERGE = -1
  395.  
  396. RETURN
  397.  
  398. WRITEDIF:
  399.  
  400.    IF MAXMAX > 1 THEN _
  401.       CALL WRITENEW (FIRSTDIF$,NWRITE)
  402.  
  403.    RETURN
  404.  
  405. CHKEXCEED:
  406.  
  407.    M$ = ""
  408.    IF I=UBOUND(MBUF$) THEN_
  409.      M$="[File "+ORIGFILE$+"]"_
  410.    ELSE IF J = UBOUND(TBUF$) THEN_
  411.      M$="[File "+BTCHCMDS$+"]"
  412.  
  413. RETURN
  414.  
  415. CHKDIF:
  416.  
  417. IF I = J THEN _
  418.   ARE.DIFF = 0 _
  419. ELSE _
  420.   ARE.DIFF = -1
  421. IF I<=J THEN _
  422.    MAX = I _
  423. ELSE _
  424.    MAX = J 
  425. MAXMAX = J
  426. K=0
  427. CHKAG:
  428.   K=K+1:IF K<=MAX THEN IF TBUF$(K)=MBUF$(K) THEN GOTO CHKAG ELSE ARE.DIFF=-1
  429. GETOUTCHKDIF:
  430.  
  431. RETURN
  432.  
  433. COMPARENUTRANS:
  434.  
  435.    IF NOT PRESERVE.COMMENTS THEN RETURN
  436.    CALL FIRSTWORD (NUTRANS$,FW$,BEGIN.AT)
  437.    IF LEFT$(FW$,4) = BLED.SOURCE.COMMENT$ THEN _
  438.      NUTRANS$ = LEFT$(NUTRANS$,BEGIN.AT-1) + DOCCHAR$ + _
  439.                 RIGHT$(NUTRANS$,LEN(NUTRANS$)-BEGIN.AT-3)
  440.  
  441. RETURN
  442.  
  443. COMPARETBUF:
  444.  
  445.    IF NOT PRESERVE.COMMENTS THEN RETURN
  446.    FOR I=1 TO MAXMAX
  447.      CALL FIRSTWORD (TBUF$(I),FW$,BEGIN.AT)
  448.      IF LEFT$(FW$,4) = BLED.SOURCE.COMMENT$ THEN _
  449.        TBUF$(I) = LEFT$(TBUF$(I),BEGIN.AT-1) + DOCCHAR$ + _
  450.           RIGHT$(TBUF$(I),LEN(TBUF$(I))-BEGIN.AT-3)
  451.    NEXT
  452.      
  453. RETURN
  454.  
  455. REM -----------------------[ DOLINEMERGE ]---------------------------------
  456.  
  457. DOLINEMERGE:
  458.  
  459. REM               MERGES BASED ON LINE NUMBER LABELS
  460.  
  461.   TOPTITLE$ = "MERGING using Line Number Labels"
  462.   GOSUB STANDARDFILES
  463.   IF FANS$ = "Q" THEN RETURN
  464.  
  465.    TRANS# = 0
  466.    MAST#  = 0
  467.    GOSUB READLINETRANS
  468.    GOSUB READLINEOLD
  469.    WHILE TRANS# < HI.VALUE# OR MAST# < HI.VALUE#
  470.       WHILE TRANS# < MAST# AND J < MAXBTWLINES
  471.         PREV# = TRANS#
  472.         J = 0
  473.         WHILE PREV# = TRANS#
  474.          IF ONLY.LINENO THEN_
  475.            M$=TRANS$:_
  476.            N$="Line number to be deleted not found.":_
  477.            CALL WRMIS (M$,N$)_
  478.          ELSE_
  479.            J = J+1 : _
  480.            TBUF$(J) = NUTRANS$
  481.          GOSUB READLINETRANS
  482.         WEND
  483.         FOR I=1 TO J:CALL WRITENEW(TBUF$(I),NWRITE):NEXT
  484.       WEND
  485.       WHILE MAST# < TRANS#
  486.          PREV# = MAST#
  487.          WHILE PREV# = MAST#
  488.            CALL WRITENEW (TRANS$,NWRITE)
  489.            GOSUB READLINEOLD
  490.          WEND
  491.       WEND
  492.       IF TRANS# = MAST# AND MAST# < HI.VALUE# THEN_
  493.          PREV# = TRANS#:J=0:_
  494.          WHILE PREV# = TRANS# AND J < MAXBTWLINES:_
  495.            GOSUB CHKWRITE:_
  496.            GOSUB READLINETRANS:_
  497.          WEND:_
  498.          FOR I=1 TO J:CALL WRITENEW(TBUF$(I),NWRITE):NEXT:_
  499.          WHILE PREV# = MAST#:_
  500.            GOSUB READLINEOLD:_
  501.          WEND
  502.    WEND
  503.    CLOSE #1,#2
  504.  
  505. RETURN
  506.  
  507. CHKWRITE:
  508.  
  509. IF NOT ONLY.LINENO THEN J=J+1:TBUF$(J)=NUTRANS$
  510.  
  511. RETURN
  512.  
  513. READLINEOLD:
  514.  
  515.    IF EOF(1) THEN_
  516.      MAST# = HI.VALUE#_
  517.    ELSE_
  518.      GOSUB READOLDREC:_
  519.      CALL FIRSTWORD (TRANS$,FW$,BEGIN.AT):_
  520.      IF FW$="" THEN PREV.MAST=0:RETURN_
  521.      ELSE_
  522.        CONTINUED.MAST = PREV.MAST:_
  523.        CALL CHKCONT (TRANS$,LINEON$,REMCHAR$,PREV.MAST):_
  524.        IF CONTINUED.MAST=0 THEN_
  525.          CALL NUMERIC (FW$,NATNO):_
  526.          IF NATNO THEN_
  527.            PREV# = MAST#:_
  528.            MAST# = VAL(FW$):_
  529.            IF MAST# <= PREV# THEN_
  530.              N$ = "Source line "+FW$+" occurs after line#"+STR$(PREV#):_
  531.              CALL WRMIS (TRANS$,N$)_
  532.            ELSE_
  533.              LOG.LINES = LOG.LINES + 1 : _
  534.              IF MAX.LL > 0 THEN _
  535.                 IF LOG.LINES > MAX.LL THEN _
  536.                    COLOR 7,0 : _
  537.                    PRINT : _
  538.                    PRINT "              Sample MERGE created from ";MAX.LL;" lines":_
  539.                    END
  540. rem IF (MAST# >= 9000 AND MAST# <= 9600) THEN_
  541. rem   X$="mast-out="+STR$(mast#)+" continued="+STR$(continued.mast)+" curr cont="+STR$(prev.mast)+" numeric="+STR$(natno):_
  542. rem    Y$="":CALL WRMIS (X$,Y$)
  543. RETURN
  544.  
  545. READLINETRANS:
  546.  
  547.     ONLY.LINENO = 0
  548.     IF EOF(2) THEN_
  549.       TRANS# = HI.VALUE#_
  550.     ELSE_
  551.       CALL GETTRANS (NUTRANS$,NTRANS):_
  552.       CALL FIRSTWORD (NUTRANS$,FW$,BEGIN.AT):_
  553.       IF FW$="" THEN PREV.CONT=0:RETURN_
  554.       ELSE IF (LEFT$(FW$,1)=DOCCHAR$ AND IN.MERGE) THEN_
  555.              GOSUB CHKPRESERVE:GOTO READLINETRANS_
  556.            ELSE CONTINUED.LINE = PREV.CONT:_
  557.                   CALL CHKCONT (NUTRANS$,LINEON$,REMCHAR$,PREV.CONT):_
  558.                   IF CONTINUED.LINE=0 THEN_
  559.                     CALL NUMERIC (FW$,NATNO):_
  560.                     IF NATNO THEN_
  561.                       PREV# = TRANS#:_
  562.                       TRANS# = VAL(FW$):_
  563.                       IF TRANS# <= PREV# THEN_
  564.                         N$ = "Merge line# "+FW$+" occurs after line#"+STR$(PREV#):_
  565.                         CALL WRMIS (NUTRANS$,N$)_
  566.                       ELSE_
  567.                         X$ = NUTRANS$:_
  568.                         CALL TRIM (X$):_
  569.                         IF X$ = FW$ THEN ONLY.LINENO = -1
  570. RETURN
  571.  
  572. CHKPRESERVE:
  573. REM print "chkpreserve: preserve?=";preserve.comments
  574.   IF NOT PRESERVE.COMMENTS THEN RETURN
  575.   IF INSTR(NUTRANS$,"-[ first") > 0 THEN RETURN
  576. 'print "<";nutrans$;">"
  577. 'print "cont? line=";continued.line;" prev=";prev.cont:input xx$
  578.   NUTRANS$ = LEFT$(NUTRANS$,BEGIN.AT-1) + BLED.SOURCE.COMMENT$ + _
  579.              RIGHT$(NUTRANS$,LEN(NUTRANS$)-BEGIN.AT)
  580.   IF PREV.CONT = -1 THEN_
  581.      CALL WRITENEW (NUTRANS$,NWRITE)_
  582.   ELSE_
  583.      RETURN EXIT2LEVELS
  584. REM print "<";nutrans$;">"
  585.  
  586. RETURN
  587. EXIT2LEVELS:
  588.    RETURN
  589.  
  590. REM -----------------------[ DOMERGE ]-------------------------------------
  591.  
  592. DOMERGE:
  593.  
  594. REM        GENERAL BLED MERGE BASED ON BLOCK and BLOCK DISPOSITION
  595.  
  596.   TOPTITLE$ = "MERGING - General BLED"
  597.   GOSUB STANDARDFILES
  598.   IF FANS$ = "Q" THEN RETURN
  599.   
  600.   CALL GETNXTCMD (CMD$,DOCCHAR$,STBLKTYPE$,ENDBLKTYPE$,STDES.NO%,ENDDES.NO%,_
  601.                  STTARGET$,ENDTARGET$,INCREMENT%,PTR%,CMD.TYPE$,_
  602.                  INS.BLKTYPE$,FIXED.NO%,BLK.DISP$)
  603.   
  604.   WHILE CMD.TYPE$ <> ""
  605. REM     PRINT "domerge: CMD$=";CMD$;" TYPE=";CMD.TYPE$;" INS BLKTYPE=";INS.BLKTYPE$
  606.      IF CMD.TYPE$ = "I" THEN_
  607.         IF INS.BLKTYPE$ = "L" THEN_
  608.             GOSUB WRNTIMES_
  609.         ELSE_
  610.             GOSUB WRTBLOCK_
  611.      ELSE_
  612.         LINE.DISP$ = "K":_
  613.         PTR.INCREMENT% = 1:_
  614.         TARGET$ = STTARGET$:_
  615.         BLOCK.TYPE$ = STBLKTYPE$:_
  616.         DESIRED.PTR = STDES.NO%:_
  617.         GOSUB ADVANCE:_
  618.         LINE.DISP$ = BLK.DISP$:_
  619.         BLOCK.TYPE$ = ENDBLKTYPE$:_
  620.         DESIRED.PTR = ENDDES.NO%:_
  621.         TARGET$ = ENDTARGET$:_
  622.         PTR.INCREMENT% = INCREMENT%:_
  623.         GOSUB ADVANCE
  624.      CALL GETNXTCMD (CMD$,DOCCHAR$,STBLKTYPE$,ENDBLKTYPE$,STDES.NO%,ENDDES.NO%,_
  625.                  STTARGET$,ENDTARGET$,INCREMENT%,PTR%,CMD.TYPE$,_
  626.                  INS.BLKTYPE$,FIXED.NO%,BLK.DISP$)
  627.  
  628.   WEND
  629.   CLOSE #1,#2
  630.   
  631. RETURN
  632.  
  633. ADVANCE:
  634.       REM DECIDES HOW TO ADVANCE THROUGH OLD FILE
  635.       REM PASS BLOCK.TYPE$
  636.  
  637.       IF BLOCK.TYPE$ = "L" THEN_
  638.           GOSUB READTOLINE_
  639.       ELSE IF BLOCK.TYPE$ = "S" THEN_
  640.           GOSUB READTOSTRING_
  641.       ELSE IF BLOCK.TYPE$ = "LABEL" OR BLOCK.TYPE$="LABEL#" THEN_
  642.           GOSUB READTOLABEL_
  643.       ELSE_
  644.           M$="WARNING: ILLEGAL BLOCK TYPE ":_
  645.           W$=BLOCK.TYPE$:_
  646.           CALL WRMIS (M$,W$)
  647. RETURN
  648.          
  649. READTOLINE:
  650.  
  651.    REM READS UPTO LINE DESIRED.PTR IN OLD
  652.  
  653.    WHILE PTR% < DESIRED.PTR AND NOT EOF(1)
  654.       GOSUB READOLD
  655.       PTR% = PTR% + PTR.INCREMENT%
  656.       IF LINE.DISP$ = "K" THEN CALL WRITENEW (TRANS$,NWRITE)
  657.    WEND
  658. RETURN
  659.  
  660. READTOSTRING:
  661.  
  662.    REM READS UPTO A STRING IN OLD
  663.  
  664.    TRANS$ = TARGET$
  665.    IF NOT EOF(1) THEN GOSUB READOLD
  666.    WHILE INSTR(TRANS$,TARGET$) = 0
  667.       PTR% = PTR% + 1
  668.       IF LINE.DISP$ = "K" THEN CALL WRITENEW (TRANS$,NWRITE)
  669.       IF NOT EOF(1) THEN_
  670.          GOSUB READOLD_
  671.       ELSE_
  672.          M$ = "WARNING: STRING "+TARGET$+" NOT FOUND":_
  673.          W$ = "":_
  674.          CALL WRMIS (M$,W$):_
  675.          TRANS$ = TARGET$
  676.    WEND
  677.    PREV.OLD$ = TRANS$
  678.  
  679. RETURN
  680.  
  681. READTOLABEL:
  682.  
  683.    REM READS UPTO A LABEL IN OLD
  684.  
  685.    IF IGNORECASE THEN CALL UPCASE (TARGET$)
  686.    IF BLOCK.TYPE$ = "LABEL" AND RIGHT$(TARGET$,1) <> END.LABEL$ THEN_
  687.       TARGET$ = TARGET$ + END.LABEL$
  688.    IF NOT EOF(1) THEN_
  689.       GOSUB READOLD:_
  690.       GOSUB GETFIRSTWORD_
  691.    ELSE_
  692.       FIRST.WORD$ = TARGET$:_
  693.       TRANS$ = ""
  694.    WHILE FIRST.WORD$ <> TARGET$
  695.       PTR% = PTR% + 1
  696.       IF LINE.DISP$ = "K" THEN CALL WRITENEW (TRANS$,NWRITE)
  697.       IF NOT EOF(1) THEN_
  698.          GOSUB READOLD:_
  699.          GOSUB GETFIRSTWORD_
  700.       ELSE_
  701.          M$ = "WARNING: LABEL "+TARGET$+" NOT FOUND":_
  702.          W$ = "":_
  703.          CALL WRMIS (M$,W$):_
  704.          FIRST.WORD$ = TARGET$
  705.    WEND
  706.    PREV.OLD$ = TRANS$
  707.  
  708. RETURN
  709.  
  710. GETFIRSTWORD:
  711.  
  712.    CALL FIRSTWORD (TRANS$,FIRST.WORD$,BEGIN.AT)
  713.    IF IGNORECASE THEN CALL UPCASE (FIRST.WORD$)
  714.  
  715. RETURN
  716.  
  717. READOLD:
  718.  
  719.    REM FETCHES NEXT UNPROCESSED RECORD FROM OLD
  720.  
  721.    IF PTR% <= NREAD THEN_
  722.       TRANS$ = PREV.OLD$_
  723.    ELSE_
  724.       GOSUB READOLDREC
  725.  
  726. RETURN
  727.  
  728. READOLDREC:
  729.  
  730.    LINE INPUT #1,TRANS$
  731.    NREAD = NREAD+1
  732.    LOCATE MROW,MCOL:PRINT NREAD;
  733.  
  734. RETURN
  735.  
  736. WRNTIMES:
  737.    REM WRITES EXACTLY N RECORDS FROM TRANSACTION FILE
  738.  
  739.    WHILE FIXED.NO% > 0 AND NOT EOF(2)
  740.       GOSUB READTRANS
  741.       FIXED.NO% = FIXED.NO% - 1
  742.       CALL WRITENEW (NUTRANS$,NWRITE)
  743.    WEND
  744. RETURN
  745.  
  746. READTRANS:
  747.  
  748.    REM FETCHES NEXT DATA (NON-COMMAND) RECORD FROM TRANSACTION FILE
  749.    REM NOTE: WILL NOT SKIP OVER ANY LINES
  750.  
  751.    CALL GETTRANS (NUTRANS$,NTRANS)
  752.    CALL FIRSTNB (NUTRANS$,ONE,BS):IF BS<1 THEN BS=1
  753.    LSET TRANSBLK$ = MID$(NUTRANS$,BS,LBLK)
  754. REM   print "RT BS=";BS;" trans=";trans$;" transblk=<";transblk$;"> endblk=<";endblk$;">"
  755.  
  756. RETURN
  757.  
  758. WRTBLOCK:
  759.  
  760.    REM INSERT ROUTINE WHEN BLOCK
  761.  
  762.    IF NOT EOF(2) THEN GOSUB READTRANS
  763.    WHILE TRANSBLK$ <> ENDBLK$ AND NOT EOF(2)
  764.       CALL WRITENEW (NUTRANS$,NWRITE)
  765.       GOSUB READTRANS
  766.    WEND
  767.  
  768. RETURN
  769.  
  770. REM --------------------[ SHARED ROUTINES ]-----------------------------
  771.  
  772. GETFILES:
  773.  
  774. REM PROMPTS FOR 3 FILE NAMES NEEDED
  775.  
  776.    GOSUB CHKEXTENSIONS
  777.    FFLDVAL$(1) = ORIGFILE$
  778.    FFLDVAL$(2) = BTCHCMDS$
  779.    FFLDVAL$(3) = NEWFILE$
  780.    CALL PRTSCRN (THREE,FROW(),FCOL(),FPROMPT$(),FFLDSIZE(),FFLDTYPE$(),_
  781.                  FFLDVAL$(),FHLP$())
  782.    CALL CENTERBEG (TOPTITLE$,SEVENTYTWO,BEG)
  783.    CALL QPRINT (TOPTITLE$,FOUR,BEG)
  784.    IF RUN.BATCH THEN FANS$="R":GOTO GOTFILES
  785.  
  786.      CO=1:CALL QPRINT (SPACE$(79),FRO,CO)
  787.      FANS$="E"
  788.      CALL GETCHAR(EDRO,EDCO,EDPRO$,EDVAL$,FANS$)
  789.      WHILE FANS$ = "E"
  790.        CALL GETSCRN (THREE,FROW(),FCOL(),FPROMPT$(),FFLDSIZE(),FFLDTYPE$(),_
  791.                FFLDVAL$(),FHLP$())
  792.        LOCATE EDRO,1:PRINT SPACE$(79)
  793.        FANS$="":CALL GETCHAR (EDRO,EDCO,EDPRO$,EDVAL$,FANS$)
  794.      WEND
  795.  
  796.    GOTFILES:  
  797.    IF FANS$<>"Q" THEN_
  798.      GOSUB PREPARECOUNTS:_
  799.      ORIGFILE$ = FFLDVAL$(1):_
  800.      BTCHCMDS$ = FFLDVAL$(2):_
  801.      NEWFILE$  = FFLDVAL$(3):_
  802.      GOSUB OPENFILES:_
  803.      PRINT #4,"--[USING FILES ";ORIGFILE$;" ";BTCHCMDS$;" ";NEWFILE$;"]--"
  804.  
  805. RETURN
  806.  
  807. CHKEXTENSIONS:
  808.  
  809.    IF INSTR(ORIGFILE$,".")=0 THEN ORIGFILE$=ORIGFILE$+"."+DESOURCE$
  810.    IF INSTR(BTCHCMDS$,".")=0 THEN_
  811.      IF FILE.COMPARE THEN_
  812.        BTCHCMDS$=BTCHCMDS$+"."+DESOURCE$_
  813.      ELSE_
  814.        BTCHCMDS$=BTCHCMDS$+"."+DEMERGES$
  815.    IF INSTR(NEWFILE$,".")=0 THEN_
  816.      IF FILE.COMPARE THEN_
  817.        NEWFILE$=NEWFILE$+"."+DEMERGES$_
  818.      ELSE_
  819.        NEWFILE$=NEWFILE$+"."+DESOURCE$
  820.  
  821. RETURN
  822.  
  823. PREPARECOUNTS:
  824.  
  825.   COLOR 0,7
  826.   LOCATE 24,1
  827.   PRINT SPACE$(79);
  828.   LOCATE 24,04:PRINT "SOURCE:";
  829.   LOCATE 24,23:PRINT "CHANGES:";
  830.   LOCATE 24,42:PRINT "NEW:";
  831.   LOCATE 24,60:PRINT "WARNINGS:";
  832.  
  833.   TROW = 24
  834.   TCOL = 31
  835.   WROW = 24
  836.   WCOL = 46
  837.   MROW = 24
  838.   MCOL = 11
  839.   WROW = 24
  840.   WCOL = 69
  841.  
  842. RETURN
  843.  
  844. STANDARDFILES:
  845.  
  846.   FHLP$(1) = "Text file to be edited (e.g. source code in TEST.BAS)"
  847.   FHLP$(2) = "Merges (edits, changes) to be applied (e.g. TEST.MRG)"
  848.   FHLP$(3) = "Save changes made in this file (e.g. old + merges -> TESTNEW.BAS)"
  849.   FPROMPT$(1)= "SOURCE File:"
  850.   FPROMPT$(2)= " MERGE File:"
  851.   FPROMPT$(3)= "   NEW File:"
  852.   GOSUB GETFILES
  853.  
  854. RETURN
  855.  
  856. OPENFILES:
  857.  
  858.   ON ERROR GOTO ERROPEN
  859.   FF$ = ORIGFILE$
  860.   OPEN "I",#1,FF$
  861.   FF$ = BTCHCMDS$
  862.   OPEN "I",#2,FF$
  863.   FF$ = NEWFILE$
  864.   OPEN "O",#3,FF$
  865.   ON ERROR GOTO 0
  866.  
  867.   NREAD = 0
  868.   NWRITE = 0
  869.   NTRANS = 0
  870.   PTR% = 1
  871.  
  872. RETURN
  873.  
  874. ERROPEN:
  875.    X$ = "Error"+STR$(ERR)+" opening file "+FF$
  876.    CALL EXPLAIN(X$)
  877.    FLDSIZ = 30
  878.    RO = 23:CO = 1:CALL QPRINT (SPACE$(79),RO,CO)
  879.    CO=13:PROMPT$ = "Enter file name (<rtn> quits): "
  880.    FFF$ = ""
  881.    CALL GETSTR (RO,CO,PROMPT$,FLDSIZ,FFF$)
  882.    IF FFF$ = "" THEN RESUME QUITMERGE ELSE FF$=FFF$:GOSUB PREPARECOUNTS:RESUME
  883. QUITMERGE: FANS$="Q":RETURN
  884.  
  885. REM *****************   SHARED CALLED SUBROUTINES   *****************
  886.  
  887. SUB WRITENEW (NEWOUT$,NWRITE%) STATIC
  888.  
  889. REM WRITES NEWOUT$ TO NEW FILE
  890.  
  891.    DEFINT A-Z
  892.    DIM OBUF$(100)
  893.    IF NWRITE% < 0 THEN _
  894.      FOR I=1 TO NUM.IN.BUF: _
  895.        PRINT #3,OBUF$(I):_
  896.      NEXT:_
  897.      NUM.IN.BUF = 0:_
  898.      EXIT SUB
  899.    IF NUM.IN.BUF = 100 THEN _
  900.      FOR I=1 TO 100:_
  901.        PRINT #3,OBUF$(I):_ 
  902.      NEXT:_
  903.      NUM.IN.BUF = 0
  904.    NUM.IN.BUF = NUM.IN.BUF + 1
  905.    OBUF$(NUM.IN.BUF) = NEWOUT$
  906.    NWRITE% = NWRITE% + 1
  907.    LOCATE 24,46:PRINT NWRITE;
  908.  
  909. END SUB
  910.  
  911. SUB CHKCONT (STRNG$,LINEON$,REMCHAR$,CONTINUED%) STATIC
  912.  
  913. REM CHECKS WHETHER LINE STRNG$ CONTINUES LOGICALLY TO NEXT LINE
  914.  
  915. DEFINT A-Z
  916. rem IF DEB=0 THEN DEB = INSTR(STRNG$,"9150 IF")
  917. rem IF DEB>0 THEN IF INSTR(STRNG$,"9510 US") THEN DEB = 0
  918. CONTINUED%=0
  919. ONE = 1
  920. BS = 1
  921. LS = LEN(STRNG$)
  922. LCO = INSTR(STRNG$,LINEON$)
  923. IF LCO=0 THEN GOTO GETOUTCHKCONT
  924.   CHKREM:
  925.     X = INSTR(BS,STRNG$,REMCHAR$)
  926.     IF X=0 THEN_
  927.        X$=STRNG$:GOTO ALLSTRNG_
  928.     ELSE_
  929.        CALL FIRSTNB (STRNG$,ONE,XX):_
  930.        IF X=XX THEN GOTO GETOUTCHKCONT
  931.     CALL INQUOTES (STRNG$,X,INQUO)
  932.     IF INQUO>0 THEN BS=INQUO+1:IF BS<=LS THEN GOTO CHKREM
  933.     X$ = LEFT$(STRNG$,X-1)
  934.   ALLSTRNG:
  935.     CALL ENDNB (X$,ES)
  936.     CONTINUED% = (MID$(X$,ES,1) = LINEON$)
  937. REM    IF CONTINUED% <> 0 THEN PRINT "es=";es;" checking char <";MID$(X$,ES,1);">  CONT?=";CONTINUED%
  938. GETOUTCHKCONT:
  939. rem IF DEB>0 THEN_
  940. rem   PRINT "CONT?=";CONTINUED%;" for >";STRNG$;"<":_
  941. rem   PRINT "LCO=";LCO;" REM POS =";X;" INQUO=";INQUO;" BS= ";BS;" ES=";ES;:INPUT XX$:PRINT
  942. END SUB
  943.  
  944. SUB INQUOTES (STRNG$,BS%,INQUO%) STATIC
  945.  
  946. REM CHECKS WHETHER CHARACTER AT POSITION BS% IN STRNG$
  947. REM        IS INSIDE A PAIR OF QUOTES.  RETURNS POSITION OF RIGHT QUOTE
  948. REM        IF INSIDE, 0 IF NOT INSIDE
  949.  
  950. DEFINT A-Z
  951. QUOTE$=CHR$(34)
  952. BEG = 1
  953. INQUO% = 0
  954. CHKQAGAIN:
  955.   FQUO = INSTR(BEG,STRNG$,QUOTE$)
  956.   IF FQUO=0 THEN GOTO GETOUTINQUOTES
  957.   IF BS%<=FQUO THEN GOTO GETOUTINQUOTES
  958.   SQUO = INSTR(FQUO+1,STRNG$,QUOTE$)
  959.   IF SQUO=0 THEN GOTO GETOUTINQUOTES
  960.   IF BS% < SQUO THEN_
  961.     INQUO%=SQUO:GOTO GETOUTINQUOTES
  962.   BEG = SQUO+1
  963. GOTO CHKQAGAIN
  964.   
  965. GETOUTINQUOTES:
  966. REM PRINT "INQUOTES: LOOKING AT POS ";BS%;"<";MID$(STRNG$,BS%,1);"> SENDING INQUO=";INQUO%
  967. END SUB
  968.  
  969.